// 导入设备存储模块
import { useDeviceStore } from '$/store'
// 导入异步操作工具
import { allSettledWrapper } from '$/utils'
// 导入Element Plus的消息组件
import { ElMessage } from 'element-plus'

/**
 * 导出一个钩子，用于处理文件操作，如选择文件和向设备发送文件
 */
export function useFileActions() {
  // 获取设备存储实例
  const deviceStore = useDeviceStore()

  // 定义一个响应式变量，用于控制文件操作的加载状态
  const loading = ref(false)

  /**
   * 根据提供的设备列表和文件，选择单个设备或多个设备发送文件
   * @param {Array|Object} ...args - 参数列表，第一个参数可以是设备列表或单个设备
   * @returns {Promise<boolean>} - 返回一个Promise，表示文件发送的结果
   */
  function send(...args) {
    const [devices] = args

    // 检查设备参数是否为数组，如果是数组则调用multipleSend，否则调用singleSend
    if (Array.isArray(devices)) {
      return multipleSend(...args)
    }

    return singleSend(...args)
  }

  /**
   * 打开文件选择对话框，让用户选择一个或多个文件
   * @returns {Promise<Array>} - 返回一个Promise，解析为用户选择的文件列表
   */
  async function selectFiles() {
    try {
      // 调用Electron的IPC渲染进程，打开文件选择对话框
      const files = await window.electron.ipcRenderer.invoke(
        'show-open-dialog',
        {
          properties: ['openFile', 'multiSelections'],
          filters: [
            {
              name: window.t('device.control.file.push.placeholder'),
              extensions: ['*'],
            },
          ],
        },
      )

      return files
    }
    catch (error) {
      // 处理文件选择过程中的错误
      const message = error.message?.match(/Error: (.*)/)?.[1] || error.message

      throw new Error(message)
    }
  }

  /**
   * 向单个设备发送文件
   * @param {Object} device - 设备对象
   * @param {Object} options - 包含文件列表和静默模式选项的对象
   * @returns {Promise<boolean>} - 返回一个Promise，表示文件发送的结果
   */
  async function singleSend(device, { savePath, files, silent = false } = {}) {
    // 如果没有提供文件，则调用selectFiles让用户选择文件
    if (!files) {
      try {
        files = await selectFiles()
      }
      catch (error) {
        ElMessage.warning(error.message)

        return false
      }
    }

    // 设置加载状态为true
    loading.value = true

    let closeLoading

    // 如果不是静默模式，则显示加载消息
    if (!silent) {
      closeLoading = ElMessage.loading(
        `${deviceStore.getLabel(device)}: ${window.t(
          'device.control.file.push.loading',
        )}`,
      ).close
    }

    let failCount = 0

    // 使用allSettledWrapper并行处理每个文件的发送
    await allSettledWrapper(files, (item) => {
      return window.adbkit.push(device.id, item, { savePath }).catch(() => {
        ++failCount
      })
    })

    // 设置加载状态为false
    loading.value = false

    // 如果是静默模式，直接返回false
    if (silent) {
      return false
    }

    // 计算总文件数、成功数和失败数
    const totalCount = files.length
    const successCount = totalCount - failCount

    // 根据发送结果显示不同的消息
    if (successCount) {
      closeLoading()

      if (totalCount > 1) {
        ElMessage.success(
          window.t('device.control.file.push.success', {
            deviceName: deviceStore.getLabel(device),
            totalCount,
            successCount,
            failCount,
          }),
        )
      }
      else {
        ElMessage.success(
          window.t('device.control.file.push.success.single', {
            deviceName: deviceStore.getLabel(device),
          }),
        )
      }

      return false
    }

    closeLoading()
    ElMessage.warning(window.t('device.control.file.push.error'))
  }

  /**
   * 向多个设备发送文件
   * @param {Array} devices - 设备列表
   * @param {Object} options - 包含文件列表的选项对象
   * @returns {Promise<void>} - 返回一个Promise，表示文件发送的完成
   */
  async function multipleSend(devices, { files } = {}) {
    // 如果没有提供文件，则调用selectFiles让用户选择文件
    if (!files) {
      try {
        files = await selectFiles()
      }
      catch (error) {
        ElMessage.warning(error.message)

        return false
      }
    }

    // 设置加载状态为true
    loading.value = true

    // 显示加载消息
    const closeMessage = ElMessage.loading(
      window.t('device.control.file.push.loading'),
    ).close

    // 使用allSettledWrapper并行处理每个设备的文件发送
    await allSettledWrapper(devices, (item) => {
      return singleSend(item, { files, silent: true })
    })

    // 关闭加载消息并显示成功消息
    closeMessage()

    ElMessage.success(window.t('common.success.batch'))

    // 设置加载状态为false
    loading.value = false
  }

  // 返回文件操作相关的函数和加载状态
  return {
    loading,
    send,
    selectFiles,
    singleSend,
    multipleSend,
  }
}
